#ifndef _DL_DEBUG_H_
#define _DL_DEBUG_H_

#include "debug.h"

#define DL_ASSERT(string)	DL_Debug::Debug::Assert(__FILE__,__LINE__,__FUNCTION__,string)
#define DL_PRINT(string)	DL_Debug::Debug::Log(Utils::Debug::DebugNone, string)
#define DL_DEBUG( ...)	DL_Debug::Debug::Log(Utils::Debug::DebugWarning,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)
#define DL_ERROR( ...)	DL_Debug::Debug::Log(Utils::Debug::DebugError,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)
#define DL_SEVERE( ...)	DL_Debug::Debug::Log(Utils::Debug::DebugSevere,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)
#define DL_CRITICAL( ...)	DL_Debug::Debug::Log(Utils::Debug::DebugCritical,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)

#define DL_CHK_ASSERT(cond, string) if(!(cond)) DL_Debug::Debug::Assert(__FILE__,__LINE__,__FUNCTION__,string)
#define DL_CHK_PRINT(cond, string) if(!(cond)) DL_Debug::Debug::Log(Utils::Debug::DebugNone, string)
#define DL_CHK_DEBUG(cond, ...) if(!(cond)) DL_Debug::Debug::Log(Utils::Debug::DebugWarning,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)
#define DL_CHK_ERROR(cond, ...) if(!(cond)) DL_Debug::Debug::Log(Utils::Debug::DebugError,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)
#define DL_CHK_SEVERE(cond, ...) if(!(cond)) DL_Debug::Debug::Log(Utils::Debug::DebugSevere,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)
#define DL_CHK_CRITICAL(cond, ...) if(!(cond)) DL_Debug::Debug::Log(Utils::Debug::DebugCritical,__FILE__, __LINE__,__FUNCTION__,__VA_ARGS__)

//#define DL_ASSERT(string)
//#define DL_PRINT(string)
//#define DL_DEBUG( ...)
//#define DL_ERROR( ...)
//#define DL_SEVERE( ...)
//#define DL_CRITICAL( ...)

// #define DL_CHK_ASSERT(cond, string)
// #define DL_CHK_PRINT(cond, string)
// #define DL_CHK_DEBUG(cond, ...)
// #define DL_CHK_ERROR(cond, ...)
// #define DL_CHK_SEVERE(cond, ...)
// #define DL_CHK_CRITICAL(cond, ...)

namespace DL_Debug
{
	namespace Debug
	{
		void Create(const OS::FileFlags &someFlags=OS::APPEND);
		void Create(const std::string aFilename, const OS::FileFlags &someFlags=OS::APPEND);
		Utils::Debug::Debug *GetInstance();
		void Assert(const std::string aFile, const int &aLine, const std::string aFunction, const std::string aMessage);
		void Log(const Utils::Debug::DebugLevel &aDebugLevel, const std::string aMessage);
		void Log(const Utils::Debug::DebugLevel &aDebugLevel, const std::string aFile, const int &aLine, const std::string aFunction, const std::string aMessage);
// 		void Log(const Utils::Debug::DebugLevel &aDebugLevel, const std::string aMessage, const double &aDouble);
// 		void Log(const Utils::Debug::DebugLevel &aDebugLevel, const std::string aFile, const int &aLine, const std::string aFunction, const std::string aMessage, const double &aDouble);
		void SetDebugLevel(const Utils::Debug::DebugLevel &aDebugLevel);
	};
	Utils::Debug::Debug *GetDebugInstance();
};

#define DL_INCREASETAB DL_Debug::GetDebugInstance()->IncreaseTabCount()
#define DL_DECREASETAB DL_Debug::GetDebugInstance()->DecreaseTabCount()

#endif
